.TITLE DPDRV .IDENT /08/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; VERSION 08 ; ; D. N. CUTLER 9-FEB-74 ; ; PREVIOUSLY MODIFIED BY: ; ; P. J. BEZEREDI ; D. N. CUTLER ; C. A. D'ELIA ; ; MODIFIED BY: ; ; ; P. J. BEZEREDI 14-DEC-77 ; ; PB050 -- REMOVE UNNEEDED CONDITIONALS FOR RSX-11M+. ; ; P. J. BEZEREDI 21-AUG-78 ; ; PB083 -- ADDITION OF SOFTWARE VOLUME VALID SUPPORT. ; ; P. J. BEZEREDI 01-FEB-79 ; ; PB097 -- ISSUE RECALIBRATE IF HEADER NOT FOUND ERROR. ; ; RP11-C/E DISK PACK CONTROLLER DRIVER ; ; MACRO LIBRARY CALLS ; .MCALL HWDDF$,PKTDF$ HWDDF$ ;DEFINE HARDWARE REGISTERS PKTDF$ ;DEFINE I/O PACKET OFFSETS ; ; EQUATED SYMBOLS ; RETRY=8. ;ERROR RETRY COUNT ; ; LOCAL DATA ; ; CONTROLLER IMPURE DATA TABLES (INDEXED BY CONTROLLER NUMBER) ; RTTBL: .BLKW R$$P11 ;ERROR RETRY COUNT AND POSITIONING FLAG ; ; DIAGNOSTIC FUNCTION CODE TABLE ; FUNTBL: .WORD IO.HMS!IQ.UMD, 20015 .WORD IO.BLS!IQ.UMD, 20011 .WORD IO.RDH!IQ.UMD, 14105 .WORD IO.WDH!IQ.UMD, 14103 .WORD IO.WCK!IQ.UMD, 00107 FUNTBE: ; ; DRIVER DISPATCH TABLE ; DDT$ DP,R$$P11 ;GENERATE DISPATCH TABLE ;+ ; **-DPINI-RP11-C/E DISK PACK CONTROLLER INITIATOR ; ; THIS ROUTINE IS ENTERED FROM THE QUEUE I/O DIRECTIVE WHEN AN I/O REQUE ; IS QUEUED AND AT THE END OF A PREVIOUS I/O OPERATION TO PROPAGATE THE ; TION OF THE DRIVER. IF THE SPECIFIED CONTROLLER IS NOT BUSY, THEN AN A ; IS MADE TO DEQUEUE THE NEXT I/O REQUEST. ELSE A RETURN TO THE CALLER I ; EXECUTED. IF THE DEQUEUE ATTEMPT IS SUCCESSFUL, THEN THE NEXT I/O OPER ; ATION IS INITIATED. A RETURN TO THE CALLER IS THEN EXECUTED. ; ; INPUTS: ; ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ; ; OUTPUTS: ; ; IF THE SPECIFIED CONTROLLER IS NOT BUSY AND AN I/O REQUEST IS WA ; ING TO BE PROCESSED, THEN THE REQUEST IS DEQUEUED AND THE I/O OP ; ATION IS INITIATED. ;- .ENABL LSB DPINI: GTPKT$ R$$P11 ;GET NEXT I/O PACKET TO PROCESS ; ; THE FOLLOWING ARGUMENTS ARE RETURNED BY $GTPKT: ; ; R1=ADDRESS OF THE I/O REQUEST PACKET. ; R2=PHYSICAL UNIT NUMBER OF THE REQUEST UCB. ; R3=CONTROLLER INDEX. ; R3=ADDRESS OF THE STATUS CONTROL BLOCK. ; R5=ADDRESS OF THE UCB OF THE CONTROLLER TO BE INITIATED. ; ; RP11-C/E DISK PACK CONTROLLER I/O REQUEST PACKET FORMAT: ; ; WD. 00 -- I/O QUEUE THREAD WORD. ; WD. 01 -- REQUEST PRIORITY, EVENT FLAG NUMBER. ; WD. 02 -- ADDRESS OF THE TCB OF THE REQUESTOR TASK. ; WD. 03 -- POINTER TO SECOND LUN WORD IN REQUESTOR TASK HEADER. ; WD. 04 -- CONTENTS OF THE FIRST LUN WORD IN REQUESTOR TASK HEADE ; WD. 05 -- I/O FUNCTION CODE (IO.RLB OR IO.WLB). ; WD. 06 -- VIRTUAL ADDRESS OF I/O STATUS BLOCK. ; WD. 07 -- RELOCATION BIAS OF I/O STATUS BLOCK. ; WD. 10 -- I/O STATUS BLOCK ADDRESS (REAL OR DISPLACEMENT + 14000 ; WD. 11 -- VIRTUAL ADDRESS OF AST SERVICE ROUTINE. ; WD. 12 -- MEMORY EXTENSION BITS (BITS 4 AND 5) OF I/O TRANSFER. ; WD. 13 -- BUFFER ADDRESS OF I/O TRANSFER. ; WD. 14 -- NUMBER OF BYTES TO BE TRANSFERED. ; WD. 15 -- NOT USED. ; WD. 16 -- LOW BYTE MUST BE ZERO AND HIGH BYTE NOT USED. ; WD. 17 -- LOGICAL BLOCK NUMBER OF I/O REQUEST. ; WD. 20 -- RELOCATION BIAS OF DIAGNOSTIC REG. ADRS ELSE NOT USED ; WD. 21 -- DIAGNOSTIC REG. BLK ADRS (REAL OR DISPL.+140000) ; MOV #RETRY&377,RTTBL(R3) ;CLEAR RECAL FLAG AND SET RETRIES CALL $VOLVD ;VALIDATE VOLUME VALID BCS 8$ ;IF CS WE FAILED TST R0 ;TRANSFER FUNCTION? BMI 1$ ;IF MI YES TST I.PRM+2(R1) ;SIZE THE DISK? BPL 8$ ;IF PL NO MOVB R2,U.BUF+1(R5) ;STUFF UNIT SELECT BITS MOV S.CSR(R4),R2 ;RETREIVE CSR ADDRESS CALL 200$ ;ABORT CONTROLLER AND SELECT UNIT JMP 105$ ;PASS REGISTERS AND EXIT 1$: ;REF LABEL .IF DF M$$EXT CALL $STMAP ;SET UP UNIBUS MAPPING ADDRESS .ENDC MOVB R2,U.BUF+1(R5) ;INSERT DRIVE NUMBER CMPB #IO.HMS/^D<256>,I.FCN+1(R1) ;DIAGNOSTIC FUNCTION? BNE 5$ ;IF NE NO MOV #FUNTBL,R0 ;GET ADDRESS OF FUNCTION TABLE 3$: CMP (R0)+,I.FCN(R1) ;FUNCTION CODE MATCH? BEQ 4$ ;IF EQ YES TST (R0)+ ;BYPASS CONTROLLER CODE CMP #FUNTBE,R0 ;END OF FUNCTION TABLE? BEQ 5$ ;IF EQ YES BR 3$ ;TRY AGAIN 4$: BIS (R0),U.BUF(R5) ;SET CONTROLLER FUNCTION BITS BR 10$ ;GO CHECK LOGICAL BLOCK NUMBER 5$: MOV #IE.IFC&377,R0 ;ASSUME ILLEGAL FUNCTION BIS #105,U.BUF(R5) ;ASSUME READ LOGICAL FUNCTION CMPB #IO.RLB/256.,I.FCN+1(R1) ;READ LOGICAL FUNCTION? BHIS 9$ ;IF HIS FUNCTION IS LEGAL 8$: JMP 100$ ;FUNCTION IS ILLEGAL 9$: BEQ 10$ ;IF EQ FUNCTION WAS READ SUB #2,U.BUF(R5) ;CONVERT TO WRITE LOGICAL FUNCTION 10$: CALL $BLKCK ;CHECK LOGICAL BLOCK NUMBER CALL $CVLBN ;CONVERT LOGICAL BLOCK NUMBER MOV R2,I.PRM+10(R3) ;SAVE DESIRED CYLINDER ADDRESS SWAB R1 ;SWAP TRACK TO HIGH BYTE BIS R1,R0 ;MERGE TRACK WITH SECTOR MOV R0,I.PRM+12(R3) ;SAVE TRACK AND SECTOR ADDRESS ; ; INITIATE I/O OPERATION ; 30$: ;REF LABEL .IF DF M$$EXT CALL $MPUBM ;MAP UNIBUS TO TRANSFER .ENDC MOV S.CSR(R4),R2 ;GET ADDRESS OF CSR MOV S.PKT(R4),R1 ;RETRIEVE ADDRESS OF I/O REQUEST PACKET MOVB S.ITM(R4),S.CTM(R4) ;SET CURRENT DEVICE TIMEOUT COUNT CALL 200$ ;ABORT CONTROLLER AND SELECT UNIT ADD #10,R2 ;POINT TO DISK ADDRESS REGISTER MOV I.PRM+12(R1),(R2) ;INSERT TRACK AND SECTOR ADDRESS MOV I.PRM+10(R1),-(R2) ;INSERT CYLINDER ADDRESS MOV U.BUF+2(R5),-(R2) ;INSERT BUFFER ADDRESS MOV U.CNT(R5),-(R2) ;INSERT NUMBER OF BYTES TO TRANSFER ROR (R2) ;CONVERT TO WORD COUNT NEG (R2) ;MAKE NEGATIVE WORD COUNT TST -(R2) ;POINT BACK TO CSR MOV #IE.DNR&377,R0 ;ASSUME DRIVE NOT READY MOV -4(R2),-(SP) ;GET CONTENTS OF DRIVE STATUS REGISTER COM (SP) ;COMPLEMENT STATUS BIT #140000,(SP)+ ;DRIVE READY AND ON-LINE? BEQ 31$ ;IF EQ YES BITB #US.SPU,U.STS(R5) ;IS DRIVE SPINNING UP? BNE 35$ ;IF NE YES BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC REQUEST? BNE 39$ ;IF NE YES CALL $DVERR ;LOG DEVICE NOT READY ERROR JMP 90$ ;FINISH I/O 31$: BICB #US.SPU,U.STS(R5) ;RESET DRIVE SPINNING UP CMPB #IO.RDH!IQ.UMD&377,I.FCN(R1) ;READ HEADER FUNCTION? BEQ 33$ ;IF EQ YES CMPB #IO.WDH!IQ.UMD&377,I.FCN(R1) ;WRITE HEADER FUNCTION? BNE 34$ ;IF NE NO 33$: BIT #360,10(R2) ;SYNCHRONIZE THE SECTOR COUNTER ... BNE 33$ ;... ON THE NEXT INDEX PULSE IN CASE ... BIT #360,10(R2) ;... A UNIT OTHER THAN 0 WAS ... BNE 33$ ;... SELECTED FOR HEADER OPERATIONS. 34$: CALL $BMSET ;SET I/O ACTIVE IN BIT MAP MOVB U.BUF(R5),(R2) ;LOAD FUNCTION AND GO ; ; CANCEL I/O OPERATION IS A NOP FOR FILE STRUCTURED DEVICES. ; DPCAN: RETURN ;;;NOP FOR RP11 ;+ ; POWERFAIL IS HANDLED VIA THE DEVICE TIMEOUT FACILITY AND ; CAUSES NO IMMEDIATE ACTION ON THE UNIT. THE CURRENT TIMEOUT ; COUNT IS EXTENDED SO THAT IF THE UNIT WAS BUSY IT WILL HAVE ; SUFFICIENT TIME TO SPIN BACK UP. THE NEXT I/O REQUEST TO ANY ; UNIT WILL BE SUSPENDED FOR AT LEAST THE EXTENDED TIMEOUT UNLESS ; THE UNIT IS ALREADY READY. ;- DPPWF: TSTB S.STS(R4) ;IS DRIVE CURRENTLY BUSY? BEQ 36$ ;IF EQ NO MOVB #5,S.STS(R4) ;WAIT A MAXIMUM OF 75 SECONDS 35$: MOVB #15.,S.CTM(R4) ;15 SECONDS AT A TIME 36$: BISB #US.SPU,U.STS(R5) ;SET UNIT SPINNING UP RETURN ;+ ; **-$DPINT-RP11-C/E DISK PACK CONTROLLER INTERRUPTS ;- INTSE$ DP,PR5,R$$P11 ;;;SAVE REGISTERS AND SET PRIORITY MOV U.SCB(R5),R4 ;;;GET ADDRESS OF SCB MOV S.CSR(R4),R4 ;;;GET ADDRESS OF CSR BIC #20100,(R4) ;;;CLEAR INTERRUPT ENABLE MOVB #377,-4(R4) ;;;CLEAR ATTENTION SUMMARY BITS ON CLRB -4(R4) ;;;BOTH OLD AND ECO'D CONTROLLERS CALL $FORK ;;;CREATE A SYSTEM PROCESS MOV R4,R2 ;COPY ADDRESS OF CSR MOV U.SCB(R5),R4 ;RETRIEVE ADDRESS OF SCB MOVB S.CON(R4),R3 ;RETRIEVE CONTROLLER INDEX MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS MOV #IS.SUC&377,R0 ;ASSUME SUCCESSFUL TRANSFER BITB #IQ.UMD,I.FCN(R1) ;DIAGNOSTIC FUNCTION EXECUTED? 39$: BNE 105$ ;IF NE YES ASRB RTTBL+1(R3) ;HOME SEEK IN PROGRESS? BCS 59$ ;IF CS YES TST (R2) ;ANY ERRORS? BPL 50$ ;IF PL NO CALL $DVERR ;LOG DEVICE ERROR 40$: BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES? BNE 60$ ;IF NE YES DECB RTTBL(R3) ;ANY MORE RETRIES? BLE 60$ ;IF LE NO BIT #1371,-2(R2) ;RECOVERABLE ERROR? BEQ 60$ ;IF EQ NO BIT #14000,-4(R2) ;SKI OR HNF? BEQ 46$ ;IF EQ NO 45$: MOVB #1,RTTBL+1(R3) ;SET HOME SEEK IN PROGRESS FLAG MOVB S.ITM(R4),S.CTM(R4) ;RESET DEVICE TIMEOUT COUNT CALL 200$ ;ABORT CONTROLLER AND SELECT UNIT BIS #20015,(R2) ;INITIATE HOME SEEK FUNCTION RETURN ; 46$: JMP 30$ ;RETRY ENTIRE OPERATION 50$: BITB #IO.WLC&377,I.FCN(R1) ;WRITE FOLLOWED BY WRITE CHECK? BNE 51$ ;IF NE YES BITB #US.WCK,U.STS(R5) ;WRITE CHECK ENABLED BY MCR? BEQ 90$ ;IF EQ NO 51$: MOVB U.BUF(R5),R1 ;GET LAST FUNCTION BIT #1*2,R1 ;WRITE OR WRITE CHECK FUNCTION? BEQ 90$ ;IF EQ NO BIS #2*2,U.BUF(R5) ;SET WRITE CHECK FUNCTION BIT #2*2,R1 ;WAS LAST FUNCTION A WRITE CHECK? BNE 90$ ;IF NE YES MOV #RETRY,RTTBL(R3);REINITIALIZE RETRY COUNT BR 46$ ;START WRITE CHECK OPERATION 59$: TST (R2) ;HOME SEEK SUCCESSFUL? BPL 46$ ;IF PL YES 60$: MOV #IE.WLK&377,R0 ;ASSUME DRIVE WRITE LOCKED MOV -2(R2),R1 ;GET CONTENTS OF ERROR REGISTER BMI 90$ ;IF MI WRITE LOCK ERROR MOV #IE.WCK&377,R0 ;ASSUME WRITE CHECK ERROR BIT #10,R1 ;WRITE CHECK ERROR? BNE 90$ ;IF NE YES MOV #IE.VER&377,R0 ;UNRECOVERABLE ERROR 90$: MOV 2(R2),R1 ;GET WORDS REMAINING TO TRANSFER ASL R1 ;CONVERT TO BYTES LEFT TO TRANSFER ADD U.CNT(R5),R1 ;CALCULATE BYTES ACTUALLY TRANSFERED CALL 200$ ;ABORT THE CONTROLLER 100$: MOVB S.CON(R4),R3 ;RETREIVE CONTROLLER INDEX MOVB RTTBL(R3),R2 ;GET FINAL ERROR RETRY COUNT BIS #RETRY*256.,R2 ;MERGE STARTING RETRY COUNT CALL $IODON ;FINISH I/O OPERATION JMP DPINI ;PROCESS NEXT REQUEST ; ; DEVICE TIMEOUT RESULTS IN A HOME SEEK FOLLOWED BY THE I/O OPERATION ; BEING REPEATED UNLESS THE OPERATION WAS DIAGNOSTIC. TIMEOUTS ARE ; USUALLY CAUSED BY POWERFAILURE BUT MAY ALSO BE THE RESULT OF A ; HARDWARE FAILURE. ; DPOUT: BITB #US.SPU,U.STS(R5) ;;;IS DRIVE SPINNING UP? BEQ 104$ ;;;IF EQ NO DECB S.STS(R4) ;;;HAVE WE WAITED ENOUGH YET? BEQ 104$ ;;;IF EQ YES MTPS #0 ;;;ALLOW INTERRUPTS BR 46$ ;RETRY ENTIRE OPERATION 104$: INCB S.STS(R4) ;;;LEAVE CONTROLLER BUSY BICB #US.SPU,U.STS(R5) ;;;RESET DRIVE SPINNING UP CALL $DTOER ;;;LOG DEVICE TIMEOUT BCC 110$ ;IF CC TIMEOUT DURING NORMAL FUNCTION 105$: CALL $CRPAS ;PASS CONTROLLER REGISTERS TO TASK BR 90$ ;DIAGNOSTIC PROCESSING COMPLETE 110$: MOVB U.UNIT(R5),1(R2) ;SET CURRENT UNIT NUMBER MOV S.PKT(R4),R1 ;GET I/O PACKET ADDRESS BITB #IQ.X,I.FCN(R1) ;INHIBIT RETRIES? BNE 90$ ;IF NE YES DECB RTTBL(R3) ;ANY RETRIES LEFT? BLE 90$ ;IF LE NO BR 45$ ; ;+ ; THIS ROUTINE WILL ABORT THE CONTROLLER AND SELECT THE CURRENT ; UNIT. A DELAY IS INITIATED BETWEEN EACH CONTROLLER ABORT TO ; ALLOW THE HARDWARE TIME TO SETTLE DOWN ON FAST PROCESSORS. ;- 200$: MOV #1,(R2) ;ABORT THE CONTROLLER BICB -(SP),(SP)+ ;GIVE THE HARDWARE TIME ... BICB -(SP),(SP)+ ;... TO SETTLE DOWN MOV #1,(R2) ;CLEAR ANY ERRORS CAUSED BY THE ABORT BICB -(SP),(SP)+ ;GIVE THE HARDWARE TIME ... BICB -(SP),(SP)+ ;... TO SETTLE DOWN MOVB U.BUF+1(R5),1(R2) ;SELECT THE UNIT RETURN ; .DSABL LSB .END